/**
 * @Author: linzp
 * @Date: 2021/10/26/15:51
 * 代理模式; 静态代理简单入门
 * 代理模式最主要的就是有一个公共接口（Person），一个具体的类（Student），一个代理类（StudentsProxy），代理类持有具体类的实例，代为执行具体类实例方法。上面说到，代理模式就是在访问实际对象时引入一定程度的间接性，因为这种间接性，可以附加多种用途。这里的间接性就是指不直接调用实际对象的方法，那么我们在代理过程中就可以加上一些其他用途。
 * ————————————————
 * 版权声明：本文为CSDN博主「张彦峰ZYF」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/xiaofeng10330111/article/details/105633821
 */
public class Demo {
    static interface Person{
        //交班费
        void giveMoney();
    }

    //.被代理对象实现接口，完成具体的业务逻辑
    static class Student implements Person{
        private String name;

        public Student(String name) {
            this.name = name;
        }

        @Override
        public void giveMoney() {
            System.out.println("我是学生，打钱50");
        }
    }

    //学生代理 收班费的负责人
    static class StudentProxy implements Person{

        //代理的学生
        private Student stu;

        public StudentProxy(Person student) {//!!这里是person 不是student 因为代理Person zhangsan = new Student("张三");
            if(student.getClass() == Student.class){//是学生我就帮你
                this.stu = (Student)student;
            }
        }

        @Override
        public void giveMoney() {
            System.out.println("代理人代替学生打钱");
        }
    }

    public static void main(String[] args) {
        //被代理的学生张三，他的班费上交有代理对象monitor（班长）完成
        Person zhangsan = new Student("张三");
    //    Student zhangsan = new Student("张三");
        //生成代理对象，并将张三传给代理对象
        Person monitor = new StudentProxy(zhangsan);

        //班长代理上交班费
        monitor.giveMoney();

    }
}
